{"version":3,"file":"static/chunks/pages/[[...brandSlug]]-52c80a301e09e5bb.js","mappings":"8EACA,4CACA,oBACA,WACA,OAAe,EAAQ,KAAyC,CAChE,EACA,SAFsB,6ICEf,SAASA,EAAW,CAAmC,MAAnC,IAAEC,OAAAA,CACOC,EAAAA,CAAAA,EAAAA,EAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,GAACC,MAAMC,OAAO,CAACH,IAAWA,OAAAA,EAAAA,KAAAA,EAAAA,EAASI,MAAAA,EAAS,CAAlBJ,EAAsB,GAAnFK,EAA2BJ,CAAAA,CAAAA,EAAAA,CAAhBK,EAAgBL,CAAAA,CAAAA,EAAAA,OAElC,CAAKC,MAAMC,OAAO,CAACH,IAAYA,EAAQI,MAAM,CAAG,EACvC,CAD0C,IAKjD,UAACG,EAAAA,EAAcA,CAAAA,CACbC,QAAS,UAACC,EAAAA,CAAkBT,QAASA,EAASU,SAAU,kBAAMJ,GAAa,MAC3EK,OAAQN,EACRO,KAAK,KACLC,MAAM,oBAGZ,CAMO,SAASJ,EAAkB,CAMjC,MALCT,EADgC,EAChCA,OAAAA,CACAU,EAFgC,EAEhCA,QAAAA,CASII,EAAAA,CAAAA,EAAAA,EAAAA,EAAAA,CAAOA,GAHTC,EAGED,EAHFC,QAAAA,CACAC,EAEEF,EAFFE,YAAAA,CACAC,EACEH,EADFG,SAAAA,CAAaC,MAAAA,CAOf,MACE,iCACGA,EAAOC,KAAK,CACX,UAACC,MAAAA,CAAIC,GAAG,cAAcC,UAAU,iDAC9B,UAACC,OAAAA,CAAKD,UAAU,8CAAqC,mEAIrD,KACJ,UAACE,IAAAA,CAAEF,UAAU,yBAAgB,6EAG7B,WAACG,OAAAA,CAAKf,SAAUM,EAAaN,GAAWgB,OAAO,iBAC7C,WAACC,QAAAA,CACCC,aAAW,2EACXN,UAAWO,IAAW,yBAA0B,CAAE,cAAe,CAAC,CAACX,EAAOC,CAArDU,IAA0D,GAC/EC,QAAQ,wBACT,gCAEC,UAACC,QAAAA,CAAAA,EAAAA,EAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,EAAAA,CAAAA,CAAAA,CAAAA,CACCC,mBAAkBd,EAAOC,KAAK,CAAG,mBAAgBc,EACjDC,eAAc,CAAC,CAAChB,EAAOC,KAAK,CAC5BG,UAAWO,IAAW,wBAAyB,CAC7C,aAAc,CAAC,CAACX,EAAOC,GADJU,EACS,GAE9BR,GAAG,eACCN,EAAS,QAAS,CAAEoB,SAAU,GAAMC,SA9BpB,CA8B8BC,QA9B7BlB,CAAAA,EAC7B,OAAOnB,EAAQsC,IAAI,CAAC,SAACC,CAAAA,SAAWpB,EAAMqB,WAAW,GAAGC,QAAQ,CAACF,EAAOC,WAAW,KACjF,CA4BkF,KACxEL,QAAQ,UAIZ,UAACO,SAAAA,CAAOpB,UAAU,4CAA4CqB,KAAK,kBAAS,uBAMpF,oJCgLA,MA5BA,SAASC,CAOO,MAgBwBC,EAtBtCC,EADgB,EAChBA,MA2BaF,GA3BbE,CACAC,EAFgB,EAEhBA,EA0BsB,OA1BtBA,CACAC,EAHgB,EAGhBA,OAAAA,CACAH,EAJgB,EAIhBA,SAAAA,CACAI,EALgB,EAKhBA,UAAAA,CACAC,EANgB,EAMhBA,cAAAA,CAEAC,CAAAA,EAAAA,EAAAA,EAAAA,CAAwBA,CAAC,CAAE,SAAkB,OAAVL,GAAY,EAC/C,IAAMM,EAAkBC,CAAAA,EAAAA,EAAAA,EAAAA,CAAyBA,GAEjD,MACE,iCACE,UAACC,EAAAA,EAAOA,CAAAA,CACNR,UAAWA,EACXC,UAAWA,EACXC,QAASA,EACTO,iBAAkBV,EAClBI,WAAYA,EACZC,eAAgBA,EAChBE,gBAAiBA,EACjBI,WAAYC,CAAAA,EAAAA,EAAAA,CAAAA,CAAaA,KAE1BZ,EAAY,UAAC9C,EAAAA,CAAUA,CAAAA,CAACC,OAAO,OAAE6C,EAAAA,KAAAA,EAAAA,QAAAA,EAAAA,EAAWa,CAAXb,kBAAWa,GAAXb,KAAAA,IAAAA,EAAAA,KAAAA,EAAAA,EAAgC7C,OAAO,GAAO,OAGtF,8DC7PayD,EAAgB,iBAAME,CAAAA,EAAAA,EAAAA,EAAAA,CAAGA,CAAC,UAAW,mBAAkB","sources":["webpack://_N_E/?5919","webpack://_N_E/./components/GatedModal.tsx","webpack://_N_E/./pages/[[...brandSlug]].tsx","webpack://_N_E/./utils/constants.ts"],"sourcesContent":["\n (window.__NEXT_P = window.__NEXT_P || []).push([\n \"/[[...brandSlug]]\",\n function () {\n return require(\"private-next-pages/[[...brandSlug]].tsx\");\n }\n ]);\n if(module.hot) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([\"/[[...brandSlug]]\"])\n });\n }\n ","import { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport classnames from 'classnames';\n\nimport { SecurityDialog } from '@dx-ui/osc-marketing';\n\nexport function GatedModal({ domains }: { domains?: string[] }) {\n const [isVisible, setIsVisible] = useState(Array.isArray(domains) ? domains?.length > 0 : false);\n\n if (!Array.isArray(domains) || domains.length < 1) {\n return null;\n }\n\n return (\n <SecurityDialog\n content={<GatedModalContent domains={domains} onSubmit={() => setIsVisible(false)} />}\n isOpen={isVisible}\n size=\"sm\"\n title=\"Exclusive Offers\"\n />\n );\n}\n\ntype FormData = {\n email: string;\n};\n\nexport function GatedModalContent({\n domains,\n onSubmit,\n}: {\n domains: string[];\n onSubmit: () => void;\n}) {\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<FormData>();\n\n const handleEmailValidation = (email: string) => {\n return domains.some((domain) => email.toLowerCase().includes(domain.toLowerCase()));\n };\n\n return (\n <>\n {errors.email ? (\n <div id=\"email-error\" className=\"bg-danger-alt flex justify-around p-2\">\n <span className=\"text-danger mx-8 text-lg font-bold\">\n Please enter a valid email or company code to access offers.\n </span>\n </div>\n ) : null}\n <p className=\"p-2 font-sans\">\n Enter your employee email or company code to access exclusive discounts.\n </p>\n <form onSubmit={handleSubmit(onSubmit)} method=\"POST\">\n <label\n aria-label=\"Enter your employee email or company code to access exclusive discounts.\"\n className={classnames('label w-full font-bold', { 'label-error': !!errors.email })}\n htmlFor=\"gated-email\"\n >\n Email Address or Company Code\n <input\n aria-describedby={errors.email ? 'email-error' : undefined}\n aria-invalid={!!errors.email}\n className={classnames('form-input my-2 block', {\n 'form-error': !!errors.email,\n })}\n id=\"gated-email\"\n {...register('email', { required: true, validate: handleEmailValidation })}\n required\n />\n </label>\n\n <button className=\"btn btn-2xl btn-primary mb-4 block w-full\" type=\"submit\">\n Access Offers\n </button>\n </form>\n </>\n );\n}\n","import { usePreviewSegmentsFromUrl } from '@dx-ui/cpm-mapping-shared';\nimport type { CpmData } from '@dx-ui/cpm-mapping-brands';\nimport { CpmPage, fetchServerCpmPage, FetchServerCpmPage404Error } from '@dx-ui/cpm-mapping-brands';\nimport { isGatedPage, getAccountIdFromPath } from '../utils/gated-page';\nimport type { GetServerSideProps, GetServerSidePropsContext } from 'next';\nimport { getParams } from '../utils/get-params';\nimport { type QueryClient, dehydrate } from '@tanstack/react-query';\nimport { SHOP_FORM_ORIGINAL_OP_NAMES, getServerSideShopFormData } from '@dx-ui/osc-shop-form';\nimport type { GetCompanyByAccountIdQuery } from '../generated/types';\nimport {\n serverSideGatedPagesQuery,\n serverSideGetCompanyByAccountIdQuery,\n} from '../generated/react-query';\nimport { GatedModal } from '../components/GatedModal';\nimport type { FeatureToggle } from '@dx-ui/gql-types';\nimport {\n GET_LANGUAGE_SELECTOR_ONE_LINK_CONFIG_DOCUMENT_ORIGINAL_OP_NAME,\n serverSideGetLanguageSelectorOneLinkConfigQuery,\n} from '@dx-ui/queries-osc-language-selector';\nimport {\n getBrandSlugConfig,\n getCommonServerSideFetches,\n getCommonServerSidePostFetches,\n} from '../utils/common-server-side-fetches';\nimport { logVisitorId } from '../utils/logging';\nimport { getBrandRefreshProps } from '@dx-ui/framework-theme';\nimport { BRAND_SLUG_TOGGLE_NAME } from '../utils/default-brand-config';\nimport { logError, logInfo } from '@dx-ui/framework-logger';\nimport { getIsPortfolioHomePage } from '../utils/isPortfolioHomePage';\nimport { getAppVersion } from '../utils/constants';\nimport { useInitializeConductrics } from '@dx-ui/osc-brands-wrappers';\nimport type { BrandQuery } from '@dx-ui/osc-brands-data';\n\ninterface SuccessProps {\n brandCode: string;\n brandData: BrandQuery['brand'] | null;\n cpmData: CpmData;\n gatedData: GetCompanyByAccountIdQuery | null;\n localeCode: string;\n}\n\nasync function fetchCpmDataAndGatedData(\n queryClient: QueryClient,\n ctx: GetServerSidePropsContext,\n contentPath: string,\n localeCode: string\n): Promise<[GetCompanyByAccountIdQuery | null, CpmData | null]> {\n const [gatedPagesConfig, cpmData] = await Promise.all([\n serverSideGatedPagesQuery(queryClient),\n fetchServerCpmPage({\n contentPath,\n localeCode,\n pathname: ctx.resolvedUrl,\n queryClient,\n }).catch((error: unknown) => {\n if (error instanceof FetchServerCpmPage404Error) {\n console.error(error.message, JSON.stringify(error.variables)); // eslint-disable-line no-console\n logInfo('Cpm Not Found', error.message);\n return null;\n }\n\n console.error('Error in fetchServerCpmPageWithSupportedLanguages', error); // eslint-disable-line no-console\n logError('Cpm Fetch Error', 'fetchServerCpmPageWithSupportedLanguages', ctx.req.url);\n throw error;\n }),\n ]);\n\n /**\n * Data for gated pages\n */\n\n let gatedData = null;\n\n if (isGatedPage(contentPath, gatedPagesConfig.featureConfigs?.[0]?.config)) {\n const accountId = getAccountIdFromPath(contentPath);\n\n if (!accountId) {\n throw new Error('invalid URL');\n }\n\n gatedData = await serverSideGetCompanyByAccountIdQuery(queryClient, {\n accountid: accountId,\n language: localeCode,\n }).catch((error: unknown) => {\n console.error('Error fetching serverSideGetCompanyByAccountIdQuery', error); // eslint-disable-line no-console\n logError('Cpm Fetch Error', 'serverSideGetCompanyByAccountIdQuery', ctx.req.url);\n\n return null;\n });\n }\n\n return [gatedData, cpmData];\n}\n\nexport const getServerSideProps: GetServerSideProps<SuccessProps> = async (ctx) => {\n try {\n logVisitorId(ctx);\n\n const commonFetches = await getCommonServerSideFetches(ctx);\n if ('notFound' in commonFetches) return commonFetches;\n const {\n queryClient,\n localeCode,\n translations,\n oneLinkProps,\n sstLocale,\n featureTogglesConfigs,\n } = commonFetches;\n\n const routePath = ctx.resolvedUrl;\n const isPortfolioHomePage = getIsPortfolioHomePage(routePath);\n const showLanguageSelector = isPortfolioHomePage;\n const brandSlugConfig = getBrandSlugConfig(featureTogglesConfigs);\n\n if (!brandSlugConfig) {\n throw new Error(\n `Failed Fetching toggle ${BRAND_SLUG_TOGGLE_NAME}, value missing or misconfigured`\n );\n }\n\n const featureToggles = featureTogglesConfigs?.featureToggles || [];\n const { contentPath, redirectPath } = getParams({\n brandSlugConfig,\n localeCode,\n reqPath: ctx.resolvedUrl,\n });\n\n await getServerSideShopFormData(queryClient, { getTranslateAutocomplete: true }).catch((e) => {\n console.error('Error fetching serverSideShopFormData', e); // eslint-disable-line no-console\n logError('Cpm Fetch Error', 'serverSideShopFormData', ctx.req.url);\n });\n\n if (contentPath === undefined) {\n return { notFound: true };\n }\n\n if (localeCode === undefined) {\n return { notFound: true };\n }\n\n const [gatedData, cpmData] = await fetchCpmDataAndGatedData(\n queryClient,\n ctx,\n contentPath,\n localeCode\n );\n\n // Handle 404 = cpmData will be null\n if (cpmData === null) {\n return { notFound: true };\n }\n\n const brandCode = cpmData.mappedPage.brandCode;\n const { brandData } = await getCommonServerSidePostFetches(queryClient, localeCode, brandCode);\n\n if (redirectPath) {\n return {\n redirect: {\n statusCode: 301,\n destination: `/${sstLocale}${redirectPath}`,\n },\n };\n }\n\n if (showLanguageSelector) {\n await serverSideGetLanguageSelectorOneLinkConfigQuery(queryClient).catch((error) => {\n console.log('Error in serverSideGetLanguageSelectorOneLinkConfigQuery', error); // eslint-disable-line no-console\n logError('Cpm Fetch Error', 'serverSideGetLanguageSelectorOneLinkConfigQuery', ctx.req.url);\n return null;\n });\n }\n\n // Limit the number of hosts that are allowed to embed your application.\n // @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors\n ctx?.res?.setHeader('Content-Security-Policy', `frame-ancestors 'self'`);\n\n const dehydratedQueryKeyOperationNames = [\n ...SHOP_FORM_ORIGINAL_OP_NAMES,\n GET_LANGUAGE_SELECTOR_ONE_LINK_CONFIG_DOCUMENT_ORIGINAL_OP_NAME,\n ];\n\n return {\n props: {\n brandCode,\n brandData,\n cpmData,\n // Added contentPath for easier debugging\n contentPath: cpmData.contentPath,\n gatedData,\n localeCode,\n featureToggles,\n dehydratedQueryState:\n // JSON.parse(JSON.stringify()) is hack to serialize undefined\n // https://github.com/TanStack/query/issues/1458#issuecomment-788447705\n JSON.parse(\n JSON.stringify(\n dehydrate(queryClient, {\n shouldDehydrateQuery: (query) => {\n const queryKey = query.queryKey[0] as { originalOpName?: string };\n return dehydratedQueryKeyOperationNames.includes(queryKey?.originalOpName || '');\n },\n })\n )\n ),\n ...translations,\n ...oneLinkProps,\n ...getBrandRefreshProps({ featureToggles, brandCode }),\n },\n };\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Something went wrong when retrieving data for ${ctx.req.url}`);\n // eslint-disable-next-line no-console\n console.dir(error, { depth: null });\n\n logError('Cpm Fetch Error', 'getServerSideProps', ctx.req.url);\n throw error;\n }\n};\n\ninterface LivePageProps {\n brandCode: string;\n brandData: BrandQuery['brand'];\n cpmData: CpmData;\n gatedData: GetCompanyByAccountIdQuery | null;\n localeCode: string;\n featureToggles: FeatureToggle[];\n}\n\nfunction LivePage({\n brandCode,\n brandData,\n cpmData,\n gatedData,\n localeCode,\n featureToggles,\n}: LivePageProps): JSX.Element {\n useInitializeConductrics([`Brand:${brandCode}`]);\n const previewSegments = usePreviewSegmentsFromUrl();\n\n return (\n <>\n <CpmPage\n brandCode={brandCode}\n brandData={brandData}\n cpmData={cpmData}\n corporateAccount={gatedData}\n localeCode={localeCode}\n featureToggles={featureToggles}\n previewSegments={previewSegments}\n appVersion={getAppVersion()}\n />\n {gatedData ? <GatedModal domains={gatedData?.altCorporateAccount?.domains} /> : null}\n </>\n );\n}\n\nexport default LivePage;\n","import { env } from '@dx-ui/framework-env';\n\nexport const getAppVersion = () => env('APP_VER', 'dx-brands-ui:0');\n"],"names":["GatedModal","domains","useState","Array","isArray","length","isVisible","setIsVisible","SecurityDialog","content","GatedModalContent","onSubmit","isOpen","size","title","useForm","register","handleSubmit","formState","errors","email","div","id","className","span","p","form","method","label","aria-label","classnames","htmlFor","input","aria-describedby","undefined","aria-invalid","required","validate","handleEmailValidation","some","domain","toLowerCase","includes","button","type","LivePage","gatedData","brandCode","brandData","cpmData","localeCode","featureToggles","useInitializeConductrics","previewSegments","usePreviewSegmentsFromUrl","CpmPage","corporateAccount","appVersion","getAppVersion","altCorporateAccount","env"],"sourceRoot":"","ignoreList":[]}